//
//  CTTableViewRefreshProtocol.swift
//  CodingTest
//
//  Created by LYPC on 2021/11/18.
//

import UIKit

public protocol CTTableViewRefreshProtocol: NSObjectProtocol {
    func start2LoadData(_ callback: NetErrorCallback)
    func refreshList(_ callback: NetErrorCallback)
    func loadMoreList(_ callback: NetErrorCallback)
    func reqList(_ isRefresh: Bool, _ callback: @escaping (APIResponseError?) -> Void)
    func clearTableView()
    
    var refreshTableView: CTRefreshTableView? { get set }
    var refreshPage: Int { get set }
    var refreshMore: Bool { get }
}

public extension CTTableViewRefreshProtocol {
    
    func start2LoadData(_ callback: NetErrorCallback = nil) {
        guard let tableV = refreshTableView else { return }
        tableV.startAnimating()
        reqList(true) { (error) in
            guard tableV.isAnimating else { return }
            tableV.stopAnimating()
            if error == nil { tableV.reloadData() }
            else { tableV.showTableError() }
            callback?(error)
        }
    }
    func refreshList(_ callback: NetErrorCallback = nil) {
        guard let tableV = refreshTableView else { return }
        guard !tableV.isAnimating else { return }
        reqList(true) { [weak self](error) in
            guard let `self` = self else { return }
            tableV.endRefresh()
            if error == nil {
                self.refreshPage = 1
                tableV.reloadData() }
            else { tableV.showTableError() }
            callback?(error)
        }
    }
    func loadMoreList(_ callback: NetErrorCallback = nil) {
        guard let tableV = refreshTableView else { return }
        guard !tableV.isAnimating else { return }
        if !refreshMore {
            tableV.mj_footer?.endRefreshingWithNoMoreData()
            return
        }
        refreshPage += 1
        reqList(false) { [weak self](error) in
            guard let `self` = self else { return }
            tableV.endRefresh()
            if error == nil { tableV.reloadData() }
            else { self.refreshPage -= 1 }
            callback?(error)
        }
    }
    func clearTableView() {
        guard let tableV = refreshTableView else { return }
        tableV.reloadData()
        tableV.stopAnimating()
        tableV.hideEmpty()
        tableV.hideError()
    }
}

